home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
-
- #include <QuickTimeComponents.h>
- #include <Movies.h>
- #include <StandardFile.h>
- #include <FixMath.h>
-
- #define WIDTH 320L
- #define HEIGHT 240L
- #define FPS 4
- //#define FRAMESIZE 5000
- #define FRAMESIZE 10000
- #define DURATION (600/FPS)
- #define FRAMECOUNT (FPS*60*5) // 5 minutes
-
- static void makeThatThing( FSSpec *outFile )
- {
- Handle h = NewHandleClear(FRAMESIZE);
- Handle dataRef;
- OSType dataRefType = HandleDataHandlerSubType;
- OSErr err;
- Movie m = 0;
- Track track;
- Media media;
- ImageDescriptionHandle imageDesc = 0;
- long i;
-
- (*h)[0] = 0x12;
- (*h)[1] = 0x34;
- (*h)[FRAMESIZE-2] = 0xcd;
- (*h)[FRAMESIZE-1] = 0xef;
-
- err = PtrToHand( &h, &dataRef, sizeof(Handle) );
-
- m = NewMovie( 0 );
- track = NewMovieTrack( m, WIDTH<<16, HEIGHT<<16, 0 );
- media = NewTrackMedia( track, VideoMediaType, 600, dataRef, dataRefType );
-
- imageDesc = (ImageDescriptionHandle) NewHandleClear( sizeof( ImageDescription ) );
-
- (**imageDesc).idSize = sizeof(ImageDescription);
- (**imageDesc).cType = kJPEGCodecType;
- (**imageDesc).vendor = kAppleManufacturer;
- (**imageDesc).temporalQuality = codecNormalQuality;
- (**imageDesc).spatialQuality = 0;
- (**imageDesc).width = WIDTH;
- (**imageDesc).height = HEIGHT;
- (**imageDesc).hRes = 72L << 16;
- (**imageDesc).vRes = 72L << 16;
- (**imageDesc).dataSize = 0L;
- (**imageDesc).frameCount = 1;
- (**imageDesc).depth = 24;
- (**imageDesc).clutID = -1;
- BlockMoveData( "\pLive", (**imageDesc).name, 5 );
-
- for( i = 0; i < FRAMECOUNT; i++ ) {
- err = AddMediaSampleReference( media, 0, FRAMESIZE, DURATION,
- (SampleDescriptionHandle)imageDesc, 1, 0, nil );
- }
-
- err = InsertMediaIntoTrack( track, 0, 0, GetMediaDuration( media ), fixed1 );
-
- DisposeMovie(
- FlattenMovieData( m, flattenAddMovieToDataFork + flattenForceMovieResourceBeforeMovieData,
- outFile, 'TVOD', -1,
- createMovieFileDeleteCurFile + createMovieFileDontCreateResFile ) );
-
- DisposeMovie( m );
- }
-
- static void
- makeThatResource( FSSpec *movieFile, FSSpec *resFile )
- {
- OSErr err = noErr;
- short movieref = kResFileNotOpened;
- Movie m = 0;
- short resref = kResFileNotOpened;
- short fref = 0;
- long firstSampleOffset, size;
- SampleDescriptionHandle sampleDescriptionH = (SampleDescriptionHandle) NewHandle(0);
- Handle h = nil;
-
- err = OpenMovieFile( movieFile, &movieref, fsRdPerm );
- if( err ) { DebugStr( "\p omf" ); goto bail; }
- err = NewMovieFromFile( &m, movieref, nil, 0, 0, 0 );
- if( err ) { DebugStr( "\p nmff" ); goto bail; }
- err = GetMediaSampleReference( GetTrackMedia( GetMovieTrack( m, 1 ) ),
- &firstSampleOffset, &size, 0,
- nil, nil, sampleDescriptionH, nil, 0, nil, 0 );
- if( err ) { DebugStr( "\p gmsr" ); goto bail; }
-
-
- h = NewHandle( firstSampleOffset );
- HLockHi( h );
- err = FSpOpenDF( movieFile, fsRdPerm, &fref );
- if( err ) { DebugStr( "\p fspopendf" ); goto bail; }
- err = FSRead( fref, &firstSampleOffset, *h );
- if( err ) { DebugStr( "\p fsread" ); goto bail; }
-
-
- FSpDelete( resFile );
- FSpCreateResFile( resFile, 'RSED', 'RSRC', -1 );
- resref = FSpOpenResFile( resFile, fsRdWrPerm );
- if( resref == kResFileNotOpened ) {
- DebugStr( "\p no res file" );
- goto bail;
- }
-
- AddResource( h, 'moo ', 128, "\p" );
-
- bail:
- if( m )
- DisposeMovie( m );
- if( movieref != kResFileNotOpened )
- CloseMovieFile( movieref );
- if( fref )
- FSClose( fref );
-
- if( resref != kResFileNotOpened )
- CloseResFile( resref );
- }
-
- static void
- AppendSuffix( FSSpec *fileSpec, StringPtr suffix )
- {
- short i;
- if( fileSpec->name[0] > 31-suffix[0] )
- fileSpec->name[0] = 31-suffix[0];
- for( i = 1; i <= suffix[0]; i++ )
- fileSpec->name[ ++fileSpec->name[0] ] = suffix[i];
- }
-
- void main(void)
- {
- StandardFileReply reply;
- FSSpec resFile;
-
- printf( "Make movie header for %d fps\n", FPS );
-
- EnterMovies();
-
- StandardPutFile( "\pput!", "\ptemplate.mov", &reply );
- if( reply.sfGood ) {
- makeThatThing( &reply.sfFile );
-
- resFile = reply.sfFile;
- AppendSuffix( &resFile, "\p.rsrc" );
- makeThatResource( &reply.sfFile, &resFile );
- }
- }
-